#include <iostream>
#include <cstring>
#include <string>
#include <cstdlib>

#include <sys/socket.h>
#include <sys/types.h>
#include <unistd.h>
#include <netinet/in.h>
#include <arpa/inet.h>

class UdpClient
{
    public:
    UdpClient(std::string server_ip,int server_port)
    :_sockfd(-1)
    ,_server_port(server_port)
    ,_server_ip(server_ip)
    {}


    bool InitClient()
    {
        //创建套接字
        _sockfd=socket(AF_INET,SOCK_DGRAM,0);
        if(_sockfd<0)
        {
            std::cerr<<"client socket create error"<<std::endl;
        }
        return true;
    }
    void Start()
    {
        std::string msg;//要发送的数据
        struct sockaddr_in peer;
        memset(&peer,'\0',sizeof(peer));//填入服务端的网络信息
        peer.sin_family=AF_INET;
        peer.sin_port=htons(_server_port);
        peer.sin_addr.s_addr=inet_addr(_server_ip.c_str());

        while(true)
        {
            std::cout<<"Please Enter# ";
            getline(std::cin,msg);

            //不断向服务端套接字_sockfd发送信息。唯一ip和唯一port可以确定唯一的进程，在这唯一的进程上再用_sockfd索引到对应的套接字。
            sendto(_sockfd,msg.c_str(),msg.size(),0,(struct sockaddr*)&peer,sizeof(peer));
        }
    }

    ~UdpClient()
    {
        if(_sockfd>=0)
        {
            close(_sockfd);
        }
    }
    private:
    int _sockfd;//文件描述符
    int _server_port;//服务端端口号（客户端要向哪一个端口号发送数据、接收哪一个端口号的数据）
    std::string _server_ip;//服务端IP地址（客户端要向哪一个地址发送数据、接收哪一个地址的数据）
};